/**
 * @file trapezoid.h
 * @author cvrookie
 * @brief 
 * @version 0.1
 * @date 2023-12-20
 * 
 * @copyright Copyright (c) 2023
 * @note 步进电机梯形加速算法头文件
 *       本模块支持重入,同时支持多个电机加减速
 *       本模块支持的电机最小步距角或者步长为0.01，速度精度只支持2位小数
 */

#ifndef __TRAPEZOID__
#define __TRAPEZOID__
#include <stdint.h>

typedef enum
{
    ACCEL = 0,
    CONSTANT,
    DECEL,
    STOP,
} TRAPE_ACCEL_STAT_t;


typedef struct   
{
    float               stepsize;          //电机步长或步距角,只支持2位小数精度
    uint32_t            ClkFrq;            //定时器频率
    float               accelSpeed;        //加速段加速度,只支持2位小数精度
    float               decelSpeed;        //减速段减速度,只支持2位小数精度
    float               constSpeed;        //最大速度，即匀速运行段速度,只支持2位小数精度             
    uint32_t            total_step;        //电机走过的总步长或总角度，需要与stepLengh单位相同 
}Trapecal_param;

typedef struct
{
    float                           stepsize;          //电机步长或步距角
    uint32_t                        ClkFrq;            //定时器频率
    uint32_t                        accelSpeed;        //加速段加速度
    uint32_t                        decelSpeed;        //减速段减速度
    uint32_t                        constSpeed;        //匀速运行段速度
    uint32_t                        total_step;        //电机走过的总步长或总角度，需要与stepLengh单位相同 
    uint32_t                        accelLimStep;      //加速步长上限
    uint32_t                        accelStep;         //加速段步长
    int32_t                         decelStep;         //减速段步长
    int32_t                         stepCount;         //步长计数值
    uint32_t                        prevCounterVal;    //上一个比较值的增量（控制频率用）
    int32_t                         rest;              //余数（为了使结果更为准确，算法需要）
    uint32_t                        presentCounterVal; //这次计算出来的比较值增量（控制频率用）
    TRAPE_ACCEL_STAT_t              status;            //状态，配合状态机分析而设置
}Trapecal_medium;

extern Trapecal_medium  TrapeCal_Init(Trapecal_param *trapeconfig);

uint32_t TrapeCal_Start(Trapecal_medium  *trapemedium);

extern uint32_t TrapeCal_GetAccelSteps(Trapecal_medium  *trapemedium);

extern uint32_t TrapeCal_GetdecelSteps(Trapecal_medium  *trapemedium);

extern uint32_t TrapeCal_GetConstSteps(Trapecal_medium  *trapemedium);

extern uint32_t TrapeCal_GetStepCount(Trapecal_medium  *trapemedium);

extern TRAPE_ACCEL_STAT_t TrapeCal_GetStatus(Trapecal_medium  *trapemedium);

extern TRAPE_ACCEL_STAT_t  TrapeCal_CalNextCounterVal(Trapecal_medium  *trapemedium);

#endif  /*__TRAPE__*/


